import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class test_46_1_6 {
    /*17. 电话号码的字母组合
中等
相关标签
相关企业
给定一个仅包含数字 2-9 的字符串，返回所有它能表示的字母组合。答案可以按 任意顺序 返回。

给出数字到字母的映射如下（与电话按键相同）。注意 1 不对应任何字母。

示例 1：

输入：digits = "23"
输出：["ad","ae","af","bd","be","bf","cd","ce","cf"]
示例 2：

输入：digits = ""
输出：[]
示例 3：

输入：digits = "2"
输出：["a","b","c"]*/
    public static void main(String[] args) {
        String digits = "23";
        List<String> list = letterCombinations(digits);
        list.forEach(System.out::println);
    }

    public static List<String> letterCombinations(String digits) {
        if (digits == null || digits.isEmpty()) {
            return new ArrayList<>();
        }
        List<String> list = new ArrayList<>();
        Map<Character, String> map = new HashMap<>();
        map.put('2', "abc");
        map.put('3', "def");
        map.put('4', "ghi");
        map.put('5', "jkl");
        map.put('6', "mno");
        map.put('7', "pqrs");
        map.put('8', "tuv");
        map.put('9', "wxyz");
        boom(map, list, digits, null, new StringBuilder(),0);
        return list;
    }

    private static void boom(Map<Character, String> map, List<String> list, String digits, Character character, StringBuilder sb,int index) {
        if (digits.isEmpty()) {
            list.add(sb.toString());
            return;
        }
        String letters = map.get(digits.charAt(0));
        for (int i = 0; i < letters.length(); i++) {
            char c = letters.charAt(i);
            sb.append(c);
            boom(map, list, digits.substring(1), c, sb,index+1);
            sb.deleteCharAt(index);
        }
    }


}
